/* 
 * File:   RepositorioPoller.cpp
 * Author: maximiliano
 * 
 * Created on May 14, 2013, 6:05 PM
 */

#include "client_RepositorioPoller.h"


RepositorioPoller::RepositorioPoller(Repositorio* pRepositorio, uint32_t pIntervaloPoleo) {
    _intervaloPoleo = pIntervaloPoleo;
    _repositorio = pRepositorio;
    _poleando = false;
}
void RepositorioPoller::setRepositorioPollerManejadorEvento (IRepositorioPollerManejadorEvento* pManejadorEventos){
   this->manejadorEvento = pManejadorEventos;
}
RepositorioPoller::~RepositorioPoller() {
}


void RepositorioPoller::tarea (){
    
    FileUtils f_utils;
    while(_poleando)
    {
        string aux = "chan!!";
        
        this->manejadorEvento->archivoNuevoEvento(aux);
        
        LNombreArchivo lista_inicial;
        
        if (f_utils.ObtenerNombreArchivos(this->_repositorio->GetPath(), lista_inicial))
        {
            LNombreArchivo::iterator it;
            for(it = lista_inicial.begin(); it != lista_inicial.end(); it++)
            {       
                if(!this->_repositorio->ExisteRepoItem(*it))
                {//notifico nuevo archivo
                    string path_archivo = this->_repositorio->GetPath() + *it;
                    this->manejadorEvento->archivoNuevoEvento(path_archivo);
                    RepoItem * repoitem = new RepoItem();
                    repoitem->SetFilePath(this->_repositorio->GetPath());
                    repoitem->SetFilename(*it);
                    //FALTA SETEAR EL HASH DEL REPOITEM
                    this->_repositorio->AgregarRepoItem(repoitem);
                }
                else
                {//Verificar hashes para ver si hay modificaciones

                }
            }
        }
        else this->_poleando = false;
        usleep(this->_intervaloPoleo);
    }
}

void RepositorioPoller::Iniciar() throw (Excepcion&){

    try
    {
        FileUtils f_utils;
        if (!f_utils.DirectorioExistente (this->_repositorio->GetPath()))
        {
            string msg = "Fallo al iniciar el poller.  Directorio \" ";
            msg += this->_repositorio->GetPath();
            msg += "\" inexistente.";
            
            throw Excepcion (msg);
        }
        
        this->_poleando = true;
        
        Thread::Iniciar();
    }
    catch (Excepcion &ex)
    {
        throw ex;
    }
}

void RepositorioPoller::Finalizar() throw (Excepcion&){
    
    try
    {
        if (this->_poleando)
        {
            this->_poleando = false;

            Thread::Finalizar();
        }
    }
    catch (Excepcion &ex)
    {
        throw ex;
    }
}
